home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / comm / misc / ClipWatch.lha / ClipWatch / Sources / serial-modem.c < prev    next >
Text File  |  2000-12-29  |  10KB  |  439 lines

  1. /*
  2.  
  3.      GESTION PORT SERIE / TRAMES
  4.      GESTION MODEM
  5.  
  6.      Marc Le Douarain , Décembre 1998
  7.      mavati@club-internet.fr
  8.      http://perso.club-internet.fr/mavati
  9.      http://www.multimania.com/mavati
  10.  
  11.      Dernière mise à jour : 29 décembre 2000 
  12.  
  13. */
  14.  
  15. void Mem_FreeAll(void);
  16.  
  17.  
  18. void Print_Monitor(char *chaine,int lgt,char mode,char direction)
  19. {
  20.  int i;
  21.  char car;
  22.  if (lgt>0)
  23.  {
  24.   if ((mode&2)==2)
  25.   {
  26.    if (direction==MONITOR_IN)
  27.    {
  28.     printf("<");
  29.    }
  30.    if (direction==MONITOR_OUT)
  31.    {
  32.     printf(">");
  33.    }
  34.    i=0;
  35.    {
  36.     do
  37.     {
  38.      printf("%x ",chaine[i]);
  39.      i++;
  40.     }while(i<lgt);
  41.     if (direction>0)
  42.     {
  43.      printf("\n");
  44.     }
  45.    }
  46.   }
  47.   if ((mode==0)||(mode==1)||(mode==3))
  48.   {
  49.    if (direction==MONITOR_IN)
  50.    {
  51.     printf("<");
  52.    }
  53.    if (direction==MONITOR_OUT)
  54.    {
  55.     printf(">");
  56.    }
  57.    i=0;
  58.    do
  59.    {
  60.     car=chaine[i];
  61.     switch(car)
  62.     {
  63.      case 9:
  64.       printf("[TAB]");
  65.       break;
  66.      case 13:
  67.       printf("[CR]");
  68.       break;
  69.      case 10:
  70.       printf("[LF]");
  71.       break;
  72.      case 27:
  73.       printf("[ESC]");
  74.       break;
  75.      case 0:
  76.       printf("[NULL]");
  77.       break;
  78.      default:
  79.       printf("%c",car);
  80.     }
  81.     i++;
  82.    }while(i<lgt);
  83.    if (direction>0)
  84.    {
  85.     printf("\n");
  86.    }
  87.   }
  88.  }
  89. }
  90.  
  91. void Serial_CloseAll(void)
  92. {
  93.  if (MoniteurActif)
  94.   printf("Fermeture du port série\n");
  95.  if (SerialInitOk)
  96.   CloseDevice((struct IORequest *)SerialIO);
  97.  if (IncomingIO)
  98.   DeleteExtIO((struct IORequest *)IncomingIO);
  99.  if (SerialIO)
  100.   DeleteExtIO((struct IORequest *)SerialIO);
  101.  if (SerialMP)
  102.   DeletePort(SerialMP);
  103. }
  104.  
  105. void Appli_CloseAll(void)
  106. {
  107.  Serial_CloseAll();
  108.  #ifdef GENERATE_GUI
  109.  if (App)
  110.  {
  111.   DisposeApp(App);
  112.   App=NULL;
  113.   CloseLibrary(MUIMasterBase);
  114.  }
  115.  #endif
  116.  Mem_FreeAll();
  117. }
  118.  
  119. void Serial_OpenAll(void)
  120.  int Erreur;
  121.  char MessageErreur[255];
  122.  if (MoniteurActif)
  123.   printf("Ouverture du port série\n");
  124.  SerialInitOk = FALSE;
  125.  if ((SerialMP = (struct MsgPort *) CreatePort(0, 0)) == NULL)
  126.  {
  127.   ErrorMessageRequest("Can't create message port");
  128.   Serial_CloseAll();
  129.  }
  130.  else
  131.  {
  132.   if ((SerialIO = (struct IOExtSer *) CreateExtIO(SerialMP, sizeof(struct IOExtSer))) == NULL)
  133.   {
  134.    ErrorMessageRequest("Can't allocate storage for ExtIO");
  135.    Serial_CloseAll();
  136.   }
  137.   else
  138.   {
  139.    if ((IncomingIO = (struct IOExtSer *) CreateExtIO(SerialMP, sizeof(struct IOExtSer))) == NULL)
  140.    {
  141.     ErrorMessageRequest("Can't allocate storage for ExtIO");
  142.     Serial_CloseAll();
  143.    }
  144.    else
  145.    {
  146.     Erreur=OpenDevice(SerialDevice, (long) SerialUnit, (struct IORequest *) SerialIO, 0L);
  147.     if (Erreur!=0)
  148.     {
  149.      sprintf(MessageErreur,"Can't open device '%s',unit:%d",SerialDevice,SerialUnit);
  150.      ErrorMessageRequest(MessageErreur);
  151.      Serial_CloseAll();
  152.     }
  153.     else
  154.     {
  155.      SerialInitOk=TRUE;
  156.      SerialIO->io_SerFlags = SERF_SHARED|SERF_PARTY_ON;
  157.      SerialIO->io_ReadLen=7;
  158.      SerialIO->io_WriteLen=7;
  159.      SerialIO->io_StopBits=1;
  160.      SerialIO->io_Baud=SerialSpeed;
  161.      SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
  162.      if (DoIO((struct IORequest *)SerialIO) != NULL)
  163.      {
  164.       ErrorMessageRequest("Unable to set serial params");
  165.       Serial_CloseAll();
  166.      }
  167.      else
  168.      {
  169.       memcpy(IncomingIO, SerialIO, sizeof(struct IOExtSer));
  170.      }
  171.     }
  172.    }
  173.   }
  174.  }
  175. }
  176.  
  177. void Serial_Write(struct IOExtSer *Ser_IO, char *Data,int Lgt)
  178. {
  179.  int ErrorNbr;
  180.  char MessageErreur[255];
  181.  Ser_IO->IOSer.io_Command = CMD_WRITE;
  182.  Ser_IO->IOSer.io_Length = Lgt;
  183.  Ser_IO->IOSer.io_Data = (APTR) Data;
  184.  ErrorNbr=DoIO((struct IORequest *)Ser_IO);
  185.  if (ErrorNbr != NULL)
  186.  {
  187.   sprintf(MessageErreur,"Serial write failed, error:%d",ErrorNbr);
  188.   ErrorMessageRequest(MessageErreur);
  189.   Appli_CloseAll();
  190.   exit(30);
  191.  }
  192.  if (MoniteurActif)
  193.  {
  194.   Print_Monitor(Data,Lgt,MoniteurMode,MONITOR_OUT);
  195.  }
  196. }
  197.  
  198. int Serial_Read(struct IOExtSer *Ser_IO, APTR Data)
  199. {
  200.  int length;
  201.  int ErrorNbr;
  202.  char MessageErreur[255];
  203.  IncomingIO->IOSer.io_Command = SDCMD_QUERY;
  204.  IncomingIO->IOSer.io_Actual = 0;
  205.  if (DoIO((struct IORequest *)IncomingIO) != NULL)
  206.  {
  207.   ErrorMessageRequest("Serial SDCMD_QUERY failed");
  208.   Appli_CloseAll();
  209.   exit(30);
  210.   }
  211.   if ((length = IncomingIO->IOSer.io_Actual) > 0)
  212.   {
  213.    IncomingIO->IOSer.io_Command = CMD_READ;
  214.    IncomingIO->IOSer.io_Length = length;
  215.    IncomingIO->IOSer.io_Data = Data;
  216.    ErrorNbr=DoIO((struct IORequest *)IncomingIO);
  217.    if ( ErrorNbr!= NULL)
  218.    {
  219.     /* Erreur de parité ? */
  220.     if ( (ErrorNbr==SerErr_ParityErr) || (ErrorNbr==SerErr_BufOverflow) )
  221.     {
  222.      length=0;
  223.     }
  224.     else
  225.     {
  226.      sprintf(MessageErreur,"Serial read failed, error:%d",ErrorNbr);
  227.      ErrorMessageRequest(MessageErreur);
  228.      Appli_CloseAll();
  229.      exit(30);
  230.     }
  231.    }
  232.    return length;
  233.  }
  234. }
  235.  
  236. /* Get number of seconds from clock */
  237. ULONG get_timer_secs(void)
  238. {
  239.   unsigned long secondes;
  240.   unsigned long microsecs;
  241.   CurrentTime(&secondes,µsecs);
  242.   return secondes;
  243. }
  244.  
  245.  
  246. /* Making the complete frame when calling this function many times
  247.    Back: "TRUE" if frame is complete.
  248.    --------------------------------------------------------------
  249.    DetecEOT      : caractere to indicate the end of the frame
  250.    MemoStartTime : pointer on the start time (Back: write NULL if 'TimeOut' detected)
  251.    Data          : pointer on the string to complete
  252.    NbrCarac      : pointer on the number of caracters of the string received actually
  253.    TimeOut       : nbr of seconds maxi before end of frame
  254. */
  255. int Serial_StringCompose(char DetecEOT,char *Data,int *NbrCarac,unsigned long *MemoStartTime,int TimeOut)
  256. {
  257.  char DataTemp[5000];
  258.  int NbrCaracTemp;
  259.  char EOTfound=FALSE; 
  260.  /* Récupération de la trame au fur et à mesure (fonction non-bloquante) */
  261.  NbrCaracTemp=Serial_Read(SerialIO,DataTemp);
  262.  if (NbrCaracTemp>0)
  263.  {
  264.   strcpy_limited(Data+*NbrCarac,DataTemp,NbrCaracTemp);
  265.   *NbrCarac=*NbrCarac+NbrCaracTemp;
  266.   /* Détection de la fin de trame */
  267.   if (Data[(*NbrCarac)-1]==DetecEOT)
  268.   {
  269.    if (MoniteurActif)
  270.    {
  271.     Print_Monitor(Data,*NbrCarac,MoniteurMode,MONITOR_IN);
  272.    }
  273.    EOTfound=TRUE;
  274.   }
  275.  }
  276.  /* Verifying the Time-Out if used */
  277.  if (MemoStartTime!=NULL)
  278.  {
  279.   if ((get_timer_secs()-*MemoStartTime)>TimeOut)
  280.   {
  281.    *MemoStartTime=NULL;
  282.    if (MoniteurActif)
  283.     printf("Erreur:TimeOut in StringCompose!\n");
  284.   }
  285.  }
  286.  return EOTfound;
  287. }
  288.  
  289. /* ############################### */
  290. /* # Initialization of the modem # */
  291. /* ############################### */
  292. int init_modem(char *InitString)
  293. {
  294.  int InitOk=FALSE;
  295.  char TrameToModem[64];
  296.  char TrameFmModem[256];
  297.  int LgtTrameFmModem;
  298.  int TrameComplete;
  299.  unsigned long MemoTime;
  300.  int nbratt;
  301.  /* Send standart string 'ATZ' */
  302.  strcpy(TrameToModem,"ATZ\r");
  303.  Serial_Write(SerialIO,TrameToModem,4);
  304.  MemoTime=get_timer_secs();
  305.  nbratt=3;
  306.  do
  307.  {
  308.   LgtTrameFmModem=0;
  309.   do
  310.   {
  311.    TrameComplete=Serial_StringCompose(10,TrameFmModem,&LgtTrameFmModem,&MemoTime,5);
  312.    Delay(5);
  313.   }
  314.   while ((TrameComplete!=TRUE)&&(MemoTime!=NULL));
  315.   if (MemoTime!=NULL)
  316.   {
  317.    if (str_pos(TrameFmModem,LgtTrameFmModem,"OK",2)==NULL)
  318.    {
  319.     nbratt--;
  320.    }
  321.    else
  322.    {
  323.     InitOk=TRUE;
  324.    }
  325.   }
  326.  }
  327.  while((InitOk!=TRUE)&&(MemoTime!=NULL)&&(nbratt>0));
  328.  
  329.  /* Send configuration string */
  330.  if ( (InitOk)&&(strlen(InitString)>0) )
  331.  {
  332.   InitOk=FALSE;
  333.   strcpy(TrameToModem,InitString);
  334.   strcpy(TrameToModem+strlen(InitString),"\r");
  335.   Serial_Write(SerialIO,TrameToModem,strlen(InitString)+1);
  336.   MemoTime=get_timer_secs();
  337.   nbratt=3;
  338.   do
  339.   {
  340.    LgtTrameFmModem=0;
  341.    do
  342.    {
  343.     TrameComplete=Serial_StringCompose(10,TrameFmModem,&LgtTrameFmModem,&MemoTime,5);
  344.     Delay(5);
  345.    }
  346.    while ((TrameComplete!=TRUE)&&(MemoTime!=NULL));
  347.    if (MemoTime!=NULL)
  348.    {
  349.     if (str_pos(TrameFmModem,LgtTrameFmModem,"OK",2)==NULL)
  350.     {
  351.      nbratt--;
  352.     }
  353.     else
  354.     {
  355.      InitOk=TRUE;
  356.     }
  357.    }
  358.   }while((InitOk!=TRUE)&&(MemoTime!=NULL)&&(nbratt>0));
  359.  }
  360.  return InitOk;
  361.  
  362. /* ################################################# */
  363. /* # Calling and waiting connection with the modem # */
  364. /* # Return : FALSE => under call                  # */
  365. /* #          TRUE => call succesfull              # */
  366. /* #          2 => Error 'TIME-OUT !'              # */
  367. /* #          3 => Error 'BUSY'                    # */
  368. /* ################################################# */
  369. int call_modem(char *NumTel,int FirstCall)
  370. {
  371.  int ConnectOk=FALSE;
  372.  char TrameToModem[64];
  373.  static char TrameFmModem[256];
  374.  static int LgtTrameFmModem;
  375.  static unsigned long MemoTime;
  376.  int TrameComplete;
  377.  char * StringConnected;
  378.  static char StringMessageSpeed[64];
  379.  
  380.  /* CALLING THE TELEPHONE NUMBER WITH ATDTxxxxxxx */
  381.  if (FirstCall)
  382.  {
  383.   strcpy(TrameToModem,"ATDT");
  384.   strcpy(TrameToModem+4,NumTel);
  385.   strcpy(TrameToModem+4+strlen(NumTel),"\r");
  386.   Serial_Write(SerialIO,TrameToModem,strlen(TrameToModem));
  387.   MemoTime=get_timer_secs();
  388.   LgtTrameFmModem=0;
  389.  }
  390.  /* WAITING MESSAGE "CONNECT" FROM MODEM */
  391.  TrameComplete=Serial_StringCompose(10,TrameFmModem,&LgtTrameFmModem,&MemoTime,50);
  392.  if (TrameComplete)
  393.  {
  394.   StringConnected=str_pos(TrameFmModem,LgtTrameFmModem,"CONNECT",7);
  395.   if (StringConnected!=NULL)
  396.   {
  397.    ConnectOk=TRUE;
  398.    strcpy(StringMessageSpeed,"Connecté à: ");
  399.    strcpy_termnotnull(StringMessageSpeed+strlen(StringMessageSpeed),StringConnected+8,13,10);
  400.    DisplayStatus(StringMessageSpeed);
  401.   }
  402.   StringConnected=str_pos(TrameFmModem,LgtTrameFmModem,"BUSY",4);
  403.   if (StringConnected!=NULL)
  404.   {
  405.    ConnectOk=3;
  406.   }
  407.   LgtTrameFmModem=0;
  408.  }
  409.  if (MemoTime==NULL)
  410.   ConnectOk=2;
  411.  return ConnectOk;
  412. }
  413.  
  414. /* ################################################# */
  415. /* # Hanging up the actual connection of the modem # */
  416. /* ################################################# */
  417. void hangup_modem(void)
  418. {
  419.  int i;
  420.  Delay(100);
  421.  Serial_Write(SerialIO,"+++",3);
  422.  Delay(10);
  423.  i=Serial_Read(SerialIO,TrameRecue);
  424.  Delay(150);
  425.  Serial_Write(SerialIO,"ATH0\r",5);
  426.  Delay(10);
  427.  i=Serial_Read(SerialIO,TrameRecue);
  428.  Delay(25);
  429.  Serial_Write(SerialIO,"ATZ\r",4);
  430.  Delay(10);
  431.  i=Serial_Read(SerialIO,TrameRecue);
  432.  Delay(25);
  433.  i=Serial_Read(SerialIO,TrameRecue);
  434. if (MoniteurActif)
  435. printf("-----%d\n",i);
  436. }
  437.